interface Todo {
  id: number;
  text: string;
}
type Listener = () => void;

let nextId = 0;
let todos: Todo[] = [{ id: nextId++, text: "Todo #1" }];
let listeners: Listener[] = [];

export const todosStore = {
  addTodo() {
    todos = [...todos, { id: nextId++, text: `Todo #${nextId}` }];
    emitChange();
  },
  subscribe(listener: Listener) {
    listeners = [...listeners, listener];
    return () => {
      listeners = listeners.filter(l => l !== listener);
    };
  },
  getSnapshot() {
    return todos;
  }
};

function emitChange() {
  for (let listener of listeners) {
    listener();
  }
}
